{
  Copyright (C) 2013-2014 Tim Sinaeve tim.sinaeve@gmail.com

  This library is free software; you can redistribute it and/or modify it
  under the terms of the GNU Library General Public License as published by
  the Free Software Foundation; either version 3 of the License, or (at your
  option) any later version.

  This program is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
  for more details.

  You should have received a copy of the GNU Library General Public License
  along with this library; if not, write to the Free Software Foundation,
  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}

unit DDuce.RandomData;

{ Utility type for generating random test data. }

{$I DDuce.inc}

interface

type
  RandomData = record
  strict private
  type
    TGender = (
      gnMale,
      gnFemale
    );

  const
    Letters    = ['a' .. 'z'];
    Vowels     = ['a', 'e', 'i', 'o', 'u', 'y'];
    Consonants = Letters - Vowels;

    {$region 'SmartPrefixes'}
    SmartPrefixes: array [0 .. 20] of string = (
      'base',
      'cor',
      'pri',
      'pre',
      'neo',
      'new',
      'or',
      'hi',
      'inter',
      'u',
      'i',
      'core',
      'xo',
      'xe',
      'xor',
      'xer',
      'qua',
      'gen',
      'in',
      're',
      'tri'
    );
    {$endregion}

    {$region 'SmartSuffixes'}
    SmartSuffixes: array [0 .. 14] of string = (
      'teq',
      'tex',
      'tec',
      'nix',
      'nova',
      'lix',
      'tor',
      'max',
      'time',
      'qua',
      'paq',
      'pac',
      'nic',
      'nec',
      'rex'
    );
    {$endregion}

    {$region 'FirstNames'}
    FirstNames: array [RandomData.TGender, 0 .. 562] of string = (
      (
        'Aaron',
        'Abraham',
        'Abram',
        'Adam',
        'Al',
        'Alan',
        'Albert',
        'Alberto',
        'Alexander',
        'Alfred',
        'Alfredo',
        'Allan',
        'Allen',
        'Alphonso',
        'Alvin',
        'Amado',
        'Andre',
        'Andres',
        'Andrew',
        'Andy',
        'Angel',
        'Angelo',
        'Anthony',
        'Antione',
        'Antoine',
        'Antonio',
        'Archie',
        'Arden',
        'Ariel',
        'Armand',
        'Arnold',
        'Arnoldo',
        'Arthur',
        'Arturo',
        'Aubrey',
        'August',
        'Barry',
        'Barton',
        'Basil',
        'Ben',
        'Benjamin',
        'Bennie',
        'Bernard',
        'Bert',
        'Bill',
        'Billie',
        'Billy',
        'Blair',
        'Blake',
        'Bobbie',
        'Bobby',
        'Brad',
        'Bradford',
        'Bradley',
        'Bradly',
        'Brady',
        'Brandon',
        'Brendan',
        'Brendon',
        'Brent',
        'Bret',
        'Brett',
        'Brian',
        'Brooks',
        'Bruce',
        'Bryan',
        'Bryce',
        'Buddy',
        'Burton',
        'Caleb',
        'Calvin',
        'Cameron',
        'Carey',
        'Carl',
        'Carlos',
        'Carlton',
        'Carmelo',
        'Carmen',
        'Carson',
        'Cary',
        'Casey',
        'Cecil',
        'Cesar',
        'Chad',
        'Chadwick',
        'Charles',
        'Charley',
        'Chauncey',
        'Chester',
        'Chris',
        'Christopher',
        'Chuck',
        'Clair',
        'Clarence',
        'Claud',
        'Claude',
        'Clay',
        'Clifford',
        'Clint',
        'Clinton',
        'Clyde',
        'Cody',
        'Colin',
        'Collin',
        'Conrad',
        'Corey',
        'Cornelius',
        'Cory',
        'Courtney',
        'Craig',
        'Curtis',
        'Dale',
        'Dallas',
        'Dalton',
        'Damon',
        'Dan',
        'Dana',
        'Daniel',
        'Dannie',
        'Danny',
        'Dante',
        'Darin',
        'Darnell',
        'Darrell',
        'Darren',
        'Darrick',
        'Daryl',
        'Dave',
        'David',
        'Dean',
        'Delbert',
        'Dennis',
        'Denny',
        'Derek',
        'Derrick',
        'Desmond',
        'Devin',
        'Dewayne',
        'Dillon',
        'Dirk',
        'Domingo',
        'Dominick',
        'Don',
        'Donald',
        'Dong',
        'Donnell',
        'Donnie',
        'Dorsey',
        'Doug',
        'Douglas',
        'Drew',
        'Duane',
        'Dustin',
        'Dwight',
        'Earl',
        'Earnest',
        'Eddie',
        'Edgar',
        'Edmund',
        'Eduardo',
        'Edward',
        'Edwin',
        'Elden',
        'Elias',
        'Elijah',
        'Eliseo',
        'Elmer',
        'Elvin',
        'Emerson',
        'Emile',
        'Emilio',
        'Emmett',
        'Enrique',
        'Eric',
        'Erick',
        'Erik',
        'Erin',
        'Ernest',
        'Erwin',
        'Eugene',
        'Eugenio',
        'Faustino',
        'Federico',
        'Felipe',
        'Felix',
        'Felton',
        'Fernando',
        'Fidel',
        'Fletcher',
        'Florencio',
        'Floyd',
        'Forrest',
        'Foster',
        'Frances',
        'Francis',
        'Francisco',
        'Frank',
        'Frankie',
        'Franklin',
        'Fred',
        'Freddie',
        'Frederick',
        'Fredrick',
        'Freeman',
        'Gabriel',
        'Garland',
        'Garry',
        'Gary',
        'Gaylord',
        'Gene',
        'George',
        'Gerald',
        'Gerard',
        'Gerardo',
        'German',
        'Gilbert',
        'Gilberto',
        'Gino',
        'Glen',
        'Glenn',
        'Gordon',
        'Grady',
        'Grant',
        'Greg',
        'Gregorio',
        'Gregory',
        'Grover',
        'Guadalupe',
        'Guillermo',
        'Hal',
        'Hans',
        'Harold',
        'Harry',
        'Harvey',
        'Haywood',
        'Hector',
        'Henry',
        'Herbert',
        'Hershel',
        'Hilario',
        'Hobert',
        'Homer',
        'Hong',
        'Horace',
        'Hosea',
        'Houston',
        'Howard',
        'Humberto',
        'Hung',
        'Ian',
        'Ignacio',
        'Ira',
        'Irvin',
        'Irving',
        'Irwin',
        'Isaac',
        'Isaiah',
        'Ivan',
        'Jack',
        'Jacob',
        'Jacques',
        'Jaime',
        'James',
        'Jamie',
        'Jan',
        'Jared',
        'Jason',
        'Jasper',
        'Javier',
        'Jay',
        'Jayson',
        'Jean',
        'Jed',
        'Jeff',
        'Jeffery',
        'Jeffrey',
        'Jeffry',
        'Jeremiah',
        'Jeremy',
        'Jermaine',
        'Jerome',
        'Jerry',
        'Jess',
        'Jesse',
        'Jessie',
        'Jesus',
        'Jewell',
        'Jim',
        'Jimmie',
        'Jimmy',
        'Joan',
        'Joe',
        'Joel',
        'Joey',
        'John',
        'Johnnie',
        'Johnny',
        'Jon',
        'Jonathan',
        'Jordan',
        'Jordon',
        'Jorge',
        'Jose',
        'Josef',
        'Joseph',
        'Josh',
        'Joshua',
        'Juan',
        'Judson',
        'Julian',
        'Julio',
        'Julius',
        'Justin',
        'Karl',
        'Keith',
        'Kelly',
        'Kelvin',
        'Ken',
        'Kendall',
        'Kenneth',
        'Kenny',
        'Kent',
        'Kermit',
        'Kerry',
        'Kevin',
        'Kim',
        'King',
        'Kirk',
        'Kristopher',
        'Kurt',
        'Kurtis',
        'Kyle',
        'Lance',
        'Lane',
        'Lanny',
        'Larry',
        'Lauren',
        'Laverne',
        'Lawerence',
        'Lawrence',
        'Lee',
        'Leo',
        'Leon',
        'Leonard',
        'Leonardo',
        'Leroy',
        'Leslie',
        'Lester',
        'Levi',
        'Lewis',
        'Lincoln',
        'Lionel',
        'Lloyd',
        'Logan',
        'Loren',
        'Lou',
        'Louis',
        'Lowell',
        'Lucas',
        'Lucio',
        'Luis',
        'Luke',
        'Lupe',
        'Luther',
        'Lyndon',
        'Lynn',
        'Mac',
        'Major',
        'Malik',
        'Manuel',
        'Marc',
        'Marcos',
        'Marcus',
        'Mario',
        'Marion',
        'Mark',
        'Marshall',
        'Martin',
        'Marty',
        'Marvin',
        'Mathew',
        'Matt',
        'Matthew',
        'Maurice',
        'Mauricio',
        'Max',
        'Melvin',
        'Merle',
        'Micah',
        'Michael',
        'Micheal',
        'Michel',
        'Miguel',
        'Mike',
        'Milton',
        'Mitchell',
        'Mohammed',
        'Monroe',
        'Monte',
        'Morris',
        'Nathan',
        'Nathaniel',
        'Neal',
        'Ned',
        'Neil',
        'Nelson',
        'Nestor',
        'Nicholas',
        'Nickolas',
        'Nicolas',
        'Noah',
        'Noel',
        'Norbert',
        'Norman',
        'Norris',
        'Oliver',
        'Omar',
        'Orlando',
        'Orville',
        'Oscar',
        'Otis',
        'Owen',
        'Pablo',
        'Palmer',
        'Pat',
        'Patrick',
        'Paul',
        'Pedro',
        'Percy',
        'Pete',
        'Peter',
        'Philip',
        'Phillip',
        'Preston',
        'Quincy',
        'Rafael',
        'Ralph',
        'Ramiro',
        'Ramon',
        'Randal',
        'Randall',
        'Randolph',
        'Randy',
        'Raphael',
        'Raul',
        'Ray',
        'Raymon',
        'Raymond',
        'Refugio',
        'Reginald',
        'Rene',
        'Rex',
        'Reynaldo',
        'Ricardo',
        'Richard',
        'Rick',
        'Rickie',
        'Ricky',
        'Robert',
        'Roberto',
        'Rocky',
        'Roderick',
        'Rodney',
        'Rodolfo',
        'Rogelio',
        'Roger',
        'Roland',
        'Ron',
        'Ronald',
        'Ronnie',
        'Ross',
        'Roy',
        'Royce',
        'Ruben',
        'Rudolf',
        'Rudolph',
        'Rudy',
        'Russell',
        'Ryan',
        'Sal',
        'Salvador',
        'Salvatore',
        'Sam',
        'Samuel',
        'Santos',
        'Scott',
        'Sean',
        'Sergio',
        'Seth',
        'Shane',
        'Shannon',
        'Shaun',
        'Shawn',
        'Silas',
        'Simon',
        'Solomon',
        'Sonny',
        'Stacy',
        'Stan',
        'Stanford',
        'Stanley',
        'Stephen',
        'Sterling',
        'Steve',
        'Steven',
        'Stewart',
        'Stuart',
        'Sydney',
        'Sylvester',
        'Taylor',
        'Ted',
        'Terrell',
        'Terry',
        'Theo',
        'Theodore',
        'Thomas',
        'Thurman',
        'Tim',
        'Timmy',
        'Timothy',
        'Toby',
        'Todd',
        'Tom',
        'Tommy',
        'Tony',
        'Tracey',
        'Tracy',
        'Travis',
        'Trent',
        'Trevor',
        'Troy',
        'Truman',
        'Ty',
        'Tyler',
        'Tyree',
        'Tyrone',
        'Ulysses',
        'Vernon',
        'Victor',
        'Vincent',
        'Vito',
        'Wade',
        'Walker',
        'Wallace',
        'Walter',
        'Walton',
        'Ward',
        'Warner',
        'Warren',
        'Wayne',
        'Weldon',
        'Wesley',
        'Whitney',
        'Wilbur',
        'Wilfred',
        'Willard',
        'William',
        'Willie',
        'Willis',
        'Wilson',
        'Winston',
        'Zachary',
        'Zachery'
      ),
      (
        'Abbie',
        'Adriana',
        'Adrienne',
        'Agnes',
        'Aida',
        'Aileen',
        'Aimee',
        'Alayna',
        'Alecia',
        'Aletha',
        'Alexandra',
        'Alexandria',
        'Alexis',
        'Alice',
        'Alicia',
        'Aline',
        'Alisa',
        'Alisha',
        'Alla',
        'Alline',
        'Allison',
        'Alma',
        'Almeda',
        'Altagracia',
        'Althea',
        'Alyssa',
        'Amanda',
        'Amber',
        'Amelia',
        'Amy',
        'Ana',
        'Andrea',
        'Andria',
        'Angela',
        'Angele',
        'Angelic',
        'Angelica',
        'Angeline',
        'Angelita',
        'Angella',
        'Angelo',
        'Angie',
        'Anita',
        'Ann',
        'Anna',
        'Anne',
        'Annette',
        'Annie',
        'Antoinette',
        'Antonia',
        'April',
        'Arlene',
        'Asha',
        'Ashlee',
        'Ashley',
        'Astrid',
        'Aubrey',
        'Audrey',
        'Augustine',
        'Aurelia',
        'Aurora',
        'Autumn',
        'Bailey',
        'Barbara',
        'Beatrice',
        'Becky',
        'Bertha',
        'Bessie',
        'Beth',
        'Bethany',
        'Betsy',
        'Bette',
        'Bettie',
        'Betty',
        'Bettye',
        'Beverly',
        'Blanch',
        'Blanche',
        'Bonita',
        'Bonnie',
        'Bonny',
        'Brandee',
        'Brandy',
        'Brenda',
        'Bret',
        'Brigitte',
        'Britney',
        'Brittney',
        'Brooke',
        'Buffy',
        'Caitlin',
        'Camilla',
        'Camille',
        'Candice',
        'Cara',
        'Carey',
        'Cari',
        'Carina',
        'Carisa',
        'Carl',
        'Carla',
        'Carlene',
        'Carli',
        'Carma',
        'Carmela',
        'Carmella',
        'Carmen',
        'Carol',
        'Carole',
        'Caroline',
        'Carolyn',
        'Carrie',
        'Casey',
        'Cassandra',
        'Cassie',
        'Catherine',
        'Cathie',
        'Cathy',
        'Cecelia',
        'Cecille',
        'Celia',
        'Chanda',
        'Chanell',
        'Chantal',
        'Charissa',
        'Charlene',
        'Charlotte',
        'Charmain',
        'Charmaine',
        'Charolette',
        'Chaya',
        'Chelsea',
        'Cheryl',
        'Christa',
        'Christina',
        'Christine',
        'Christy',
        'Chrystal',
        'Chun',
        'Cindy',
        'Claire',
        'Clarice',
        'Clarissa',
        'Claudette',
        'Claudia',
        'Claudine',
        'Colleen',
        'Connie',
        'Cora',
        'Corene',
        'Corine',
        'Corinne',
        'Cristi',
        'Cristina',
        'Crystal',
        'Cynthia',
        'Daisy',
        'Dale',
        'Dana',
        'Darla',
        'Darlene',
        'Debbie',
        'Debby',
        'Debora',
        'Deborah',
        'Debra',
        'Deena',
        'Denise',
        'Dennis',
        'Desiree',
        'Dia',
        'Diana',
        'Diane',
        'Dianna',
        'Dina',
        'Earnestine',
        'Eddie',
        'Edith',
        'Edna',
        'Edythe',
        'Eileen',
        'Elaine',
        'Elisa',
        'Elissa',
        'Eliza',
        'Elizabeth',
        'Ella',
        'Ellie',
        'Elly',
        'Elois',
        'Elsie',
        'Elyse',
        'Emilie',
        'Emily',
        'Emma',
        'Enid',
        'Era',
        'Erica',
        'Erika',
        'Erin',
        'Essie',
        'Estelle',
        'Esther',
        'Eunice',
        'Eva',
        'Evangelina',
        'Evelia',
        'Eveline',
        'Evelyn',
        'Evelyne',
        'Evonne',
        'Exie',
        'Faith',
        'Fannie',
        'Fay',
        'Faye',
        'Felicia',
        'Flora',
        'Florence',
        'Florene',
        'Florine',
        'Frieda',
        'Gabriela',
        'Gabrielle',
        'Gail',
        'Gale',
        'Gena',
        'Genevieve',
        'Georgeanna',
        'Georgette',
        'Georgia',
        'Gina',
        'Gladys',
        'Glenda',
        'Gloria',
        'Grace',
        'Gracie',
        'Guadalupe',
        'Gwen',
        'Gwendolyn',
        'Hannah',
        'Harriet',
        'Hattie',
        'Hazel',
        'Heather',
        'Heidi',
        'Helen',
        'Helene',
        'Helga',
        'Herma',
        'Hermelinda',
        'Hilda',
        'Hildred',
        'Hillary',
        'Holly',
        'Hope',
        'Hyun',
        'Ina',
        'Ines',
        'Ingrid',
        'Irene',
        'Iris',
        'Irma',
        'Isabel',
        'Ivy',
        'Jackie',
        'Jacqueline',
        'Jacquelyn',
        'Jade',
        'Jake',
        'Jami',
        'Jamie',
        'Jane',
        'Janet',
        'Janice',
        'Janie',
        'Janine',
        'Janis',
        'Janyce',
        'Jaqueline',
        'Jasmin',
        'Jean',
        'Jeanette',
        'Jeffie',
        'Jenifer',
        'Jenise',
        'Jennie',
        'Jennifer',
        'Jesse',
        'Jessica',
        'Jessie',
        'Jewel',
        'Jill',
        'Joanna',
        'Joanne',
        'Jocelyn',
        'Jodie',
        'Joeann',
        'Johanna',
        'Johnnie',
        'Jolene',
        'Josephine',
        'Josie',
        'Jovita',
        'Joy',
        'Joyce',
        'Juana',
        'Juanita',
        'Judith',
        'Judy',
        'Julia',
        'Juliana',
        'Julianna',
        'Julie',
        'Juliette',
        'June',
        'Karan',
        'Karen',
        'Kari',
        'Karla',
        'Karlene',
        'Kasey',
        'Katharyn',
        'Kathryn',
        'Kathy',
        'Katie',
        'Katrina',
        'Katy',
        'Kay',
        'Kayla',
        'Kaylee',
        'Keesha',
        'Kelley',
        'Kelly',
        'Kelsey',
        'Kendra',
        'Kenya',
        'Kerri',
        'Keshia',
        'Kevin',
        'Kiley',
        'Kim',
        'Kimberly',
        'Kris',
        'Krista',
        'Kristen',
        'Kristi',
        'Kristie',
        'Kristine',
        'Kristy',
        'Krysta',
        'Kyla',
        'Kyra',
        'Kyung',
        'Lanie',
        'Lanita',
        'Laura',
        'Lauren',
        'Laurie',
        'Lauryn',
        'Lavonne',
        'Leah',
        'Leanne',
        'Leatrice',
        'Leeann',
        'Leigh',
        'Lela',
        'Lena',
        'Leora',
        'Leslee',
        'Leslie',
        'Leta',
        'Leticia',
        'Lia',
        'Lila',
        'Lillian',
        'Linda',
        'Lindsey',
        'Lisa',
        'Lisette',
        'Liza',
        'Lizzie',
        'Loida',
        'Lois',
        'Loma',
        'Loraine',
        'Lorena',
        'Lorie',
        'Louise',
        'Lucinda',
        'Lucy',
        'Lydia',
        'Lynda',
        'Lynn',
        'Madaline',
        'Madge',
        'Mae',
        'Magan',
        'Maggie',
        'Magnolia',
        'Mallory',
        'Manuela',
        'Marcia',
        'Margaret',
        'Margarita',
        'Margie',
        'Maria',
        'Marian',
        'Marie',
        'Marilyn',
        'Marina',
        'Marion',
        'Marisa',
        'Marisol',
        'Marjorie',
        'Marla',
        'Marlene',
        'Marsha',
        'Martha',
        'Mary',
        'Maryann',
        'Marylynn',
        'Maryrose',
        'Matthew',
        'Mattie',
        'Maureen',
        'May',
        'Megan',
        'Melanie',
        'Melinda',
        'Melissa',
        'Meredith',
        'Michaela',
        'Michele',
        'Michelle',
        'Mildred',
        'Mindy',
        'Minnie',
        'Miriam',
        'Monica',
        'Monique',
        'Muriel',
        'Myra',
        'Myrna',
        'Myrtle',
        'Nadia',
        'Nadine',
        'Nakia',
        'Nakisha',
        'Nancy',
        'Nannie',
        'Naomi',
        'Natalie',
        'Natasha',
        'Nettie',
        'Nicole',
        'Nina',
        'Norma',
        'Odette',
        'Ofelia',
        'Olivia',
        'Onita',
        'Pamela',
        'Patricia',
        'Patty',
        'Peggy',
        'Penelope',
        'Penny',
        'Rachael',
        'Rachel',
        'Ramona',
        'Raquel',
        'Rebecca',
        'Regina',
        'Rita',
        'Roberta',
        'Rosalie',
        'Rosalinda',
        'Rosario',
        'Rose',
        'Roseann',
        'Rosemary',
        'Rosetta',
        'Rosette',
        'Rosie',
        'Rosita',
        'Roxanne',
        'Roxie',
        'Ruth',
        'Ruthie',
        'Sabrina',
        'Sally',
        'Samantha',
        'Sandra',
        'Sandy',
        'Sara',
        'Sarah',
        'Shannon',
        'Sharon',
        'Sheena',
        'Sheryl',
        'Shira',
        'Shirley',
        'Shonda',
        'Silvana',
        'Siobhan',
        'Slyvia',
        'Sonja',
        'Sophie',
        'Stacy',
        'Stella',
        'Stephanie',
        'Sue',
        'Susan',
        'Suzanne',
        'Suzette',
        'Sylvia',
        'Tamara',
        'Tami',
        'Tammie',
        'Tammy',
        'Tanna',
        'Tanya',
        'Teresa',
        'Teresita',
        'Thelma',
        'Theresa',
        'Tia',
        'Tiffany',
        'Tina',
        'Tommie',
        'Toni',
        'Tonya',
        'Tori',
        'Tracey',
        'Tricia',
        'Trisha',
        'Ulrike',
        'Valeria',
        'Valerie',
        'Vanessa',
        'Vera',
        'Vernice',
        'Veronica',
        'Vicki',
        'Vickie',
        'Vicky',
        'Victoria',
        'Viola',
        'Violet',
        'Virginia',
        'Vivian',
        'Vivienne',
        'Wanda',
        'Wendy',
        'Whitney',
        'Wilma',
        'Windy',
        'Yolanda',
        'Yuette',
        'Yvonne',
        'Zaida',
        'Zelma'
      )
    );
    {$endregion}

    {$region 'LastNames'}
    LastNames: array [0 .. 765] of string = (
      'Adams',
      'Adamski',
      'Adkins',
      'Agee',
      'Alcantar',
      'Alexander',
      'Alford',
      'Allen',
      'Allshouse',
      'Altman',
      'Anderson',
      'Andrews',
      'Aoki',
      'Appleby',
      'Appleton',
      'Arant',
      'Arce',
      'Arnold',
      'Arreguin',
      'Arterburn',
      'Arvin',
      'Asberry',
      'Ashley',
      'Auger',
      'Austin',
      'Auyeung',
      'Ayers',
      'Babb',
      'Bailey',
      'Bair',
      'Baird',
      'Baisley',
      'Baker',
      'Bakke',
      'Banks',
      'Banuelos',
      'Barber',
      'Barfield',
      'Barksdale',
      'Barnes',
      'Barra',
      'Barry',
      'Bartlett',
      'Battle',
      'Baxter',
      'Beattie',
      'Beatty',
      'Beaty',
      'Beckwith',
      'Bedford',
      'Beets',
      'Begaye',
      'Benton',
      'Bergmann',
      'Bertrand',
      'Black',
      'Blake',
      'Bland',
      'Blankenship',
      'Blocker',
      'Blow',
      'Bohannon',
      'Boling',
      'Boltz',
      'Bookman',
      'Boone',
      'Bortz',
      'Bouchard',
      'Boyd',
      'Boykins',
      'Bradford',
      'Brady',
      'Bragg',
      'Brandon',
      'Brantner',
      'Brewington',
      'Brinkley',
      'Britt',
      'Broadway',
      'Bromley',
      'Brooks',
      'Brouillette',
      'Brown',
      'Bruns',
      'Buck',
      'Buckley',
      'Buckner',
      'Bull',
      'Burchette',
      'Burd',
      'Burge',
      'Burger',
      'Burke',
      'Burket',
      'Butler',
      'Byrd',
      'Byrge',
      'Byrns',
      'Cahill',
      'Cain',
      'Campbell',
      'Cardello',
      'Cardwell',
      'Carlisle',
      'Carlton',
      'Carman',
      'Caro',
      'Carrell',
      'Carroll',
      'Carrozza',
      'Carson',
      'Carter',
      'Cash',
      'Castillo',
      'Castleberry',
      'Caulder',
      'Cazares',
      'Cervantes',
      'Chalmers',
      'Chao',
      'Chappell',
      'Charles',
      'Chase',
      'Cherry',
      'Chester',
      'Childers',
      'Chiles',
      'Chin',
      'Chon',
      'Clark',
      'Clayton',
      'Clem',
      'Cleveland',
      'Cline',
      'Clingman',
      'Cloud',
      'Clyburn',
      'Cobbins',
      'Cochran',
      'Coe',
      'Coleman',
      'Collins',
      'Colman',
      'Colvin',
      'Combs',
      'Comer',
      'Conant',
      'Conaway',
      'Conley',
      'Conner',
      'Cook',
      'Cooper',
      'Cooperman',
      'Copeland',
      'Cordes',
      'Cormier',
      'Cornett',
      'Cornman',
      'Correll',
      'Cortez',
      'Countess',
      'Court',
      'Cranston',
      'Crary',
      'Crider',
      'Crist',
      'Crowder',
      'Cruz',
      'Cunningham',
      'Curry',
      'Curtis',
      'Custodio',
      'Dahms',
      'Damian',
      'Daniel',
      'Danley',
      'Darr',
      'Daum',
      'Davidson',
      'Davis',
      'Davison',
      'Dawson',
      'Day',
      'Dean',
      'Deblois',
      'Decker',
      'Delacruz',
      'Delgadillo',
      'Delong',
      'Desimone',
      'Diaz',
      'Dietrich',
      'Dixon',
      'Dodson',
      'Doucette',
      'Douglass',
      'Draper',
      'Drolet',
      'Drummond',
      'Drury',
      'Duckworth',
      'Dugan',
      'Dumas',
      'Dunaway',
      'Dunn',
      'Duran',
      'Dutton',
      'Dye',
      'Echols',
      'Eckard',
      'Edwards',
      'Eichorn',
      'Eickhoff',
      'Eisenberg',
      'Eldridge',
      'Ellison',
      'Emond',
      'Engleman',
      'English',
      'Espinoza',
      'Estes',
      'Estrada',
      'Evans',
      'Fabiano',
      'Feliciano',
      'Ferguson',
      'Ferrer',
      'Fierros',
      'Figueroa',
      'Fischer',
      'Fitzgerald',
      'Flannagan',
      'Fletcher',
      'Flock',
      'Flores',
      'Flynn',
      'Foerster',
      'Ford',
      'Forman',
      'Fortner',
      'Foster',
      'Frampton',
      'Franklin',
      'Frazier',
      'Frederick',
      'Freeman',
      'French',
      'Frerichs',
      'Frey',
      'Fuentes',
      'Fuentez',
      'Fulgham',
      'Fuller',
      'Furtado',
      'Fyffe',
      'Gaines',
      'Gallaher',
      'Gallegos',
      'Gamble',
      'Gantt',
      'Garcia',
      'Gard',
      'Gardner',
      'Garfinkel',
      'Garvin',
      'Gary',
      'Garza',
      'Gemmill',
      'Gettys',
      'Gibbons',
      'Gibson',
      'Giles',
      'Gill',
      'Giordano',
      'Glasser',
      'Glenn',
      'Glines',
      'Glover',
      'Godfrey',
      'Godoy',
      'Goins',
      'Golden',
      'Gomez',
      'Gong',
      'Gonzales',
      'Gonzalez',
      'Good',
      'Goodrich',
      'Gorman',
      'Gossett',
      'Greco',
      'Green',
      'Greenberg',
      'Greene',
      'Grieco',
      'Griffith',
      'Griggs',
      'Grinder',
      'Grindstaff',
      'Grossman',
      'Groves',
      'Gruber',
      'Guarino',
      'Guerrero',
      'Gulick',
      'Gupta',
      'Hadley',
      'Hagan',
      'Haines',
      'Hall',
      'Hamblin',
      'Hamilton',
      'Hammond',
      'Hancock',
      'Handy',
      'Hankins',
      'Hansen',
      'Hanson',
      'Harden',
      'Harris',
      'Hartwell',
      'Harwood',
      'Hathaway',
      'Hauser',
      'Havens',
      'Hawley',
      'Hayner',
      'Head',
      'Hendrix',
      'Hernandez',
      'Hess',
      'Hickey',
      'Hicks',
      'Higgins',
      'Hill',
      'Hobbs',
      'Holcomb',
      'Holifield',
      'Hollis',
      'Holm',
      'Holmes',
      'Holton',
      'Hoover',
      'Hopkins',
      'Houck',
      'Houston',
      'Howell',
      'Huff',
      'Huffine',
      'Hughes',
      'Hunter',
      'Hutchinson',
      'Hutton',
      'Ince',
      'Ingle',
      'Ingram',
      'Inniss',
      'Irizarry',
      'Irvin',
      'Israel',
      'Jackson',
      'Jaco',
      'Jacobs',
      'James',
      'Jarosz',
      'Jeffries',
      'Jenkins',
      'Jennings',
      'Jensen',
      'Jerkins',
      'Jimenez',
      'Johnson',
      'Johnston',
      'Jones',
      'Joseph',
      'Joy',
      'Jules',
      'Justice',
      'Karpinski',
      'Keaton',
      'Kehl',
      'Kelleher',
      'Kelley',
      'Kelly',
      'Kemp',
      'Kennedy',
      'Kennelly',
      'King',
      'Kircher',
      'Kirkland',
      'Kizer',
      'Kunze',
      'Lackey',
      'Lakey',
      'Lam',
      'Lancaster',
      'Landgraf',
      'Lane',
      'Lang',
      'Lanham',
      'Lankford',
      'Larsen',
      'Larson',
      'Lawrence',
      'Leary',
      'Lebron',
      'Lee',
      'Lemay',
      'Lemen',
      'Lemieux',
      'Leonard',
      'Lerman',
      'Lewis',
      'Light',
      'Lim',
      'Lin',
      'Lindsey',
      'Lipscomb',
      'Lis',
      'Little',
      'Locke',
      'Loera',
      'Logan',
      'Logston',
      'Long',
      'Lopez',
      'Loy',
      'Lozano',
      'Ludwig',
      'Luke',
      'Luna',
      'Lynch',
      'Ma',
      'Maclachlan',
      'Macon',
      'Mahone',
      'Makela',
      'Makris',
      'Mallory',
      'Malloy',
      'Maltby',
      'Maniscalco',
      'Manning',
      'Manno',
      'Manos',
      'Mansfield',
      'Marshall',
      'Martin',
      'Martinez',
      'Mast',
      'Mathews',
      'Mathis',
      'Matias',
      'Maxwell',
      'May',
      'Mayberry',
      'Mayo',
      'Mays',
      'McBride',
      'McCall',
      'McCartney',
      'McCormick',
      'McDonald',
      'McDowell',
      'McFarren',
      'McGaugh',
      'McGinnis',
      'McGinty',
      'McHugh',
      'McIlvain',
      'McKee',
      'McKinney',
      'McMahon',
      'McMullan',
      'McNeal',
      'McNutt',
      'McQueen',
      'Medina',
      'Melton',
      'Merino',
      'Merritt',
      'Metz',
      'Meyer',
      'Meyers',
      'Miller',
      'Mills',
      'Milstead',
      'Mines',
      'Minor',
      'Mitchell',
      'Montoya',
      'Moore',
      'Moran',
      'Morris',
      'Morton',
      'Mosby',
      'Moss',
      'Mueller',
      'Mullen',
      'Mullins',
      'Munoz',
      'Murphy',
      'Murray',
      'Myers',
      'Nava',
      'Navarro',
      'Navas',
      'Naylor',
      'Nebeker',
      'Neil',
      'Nelson',
      'Netto',
      'Newton',
      'Ngo',
      'Nguyen',
      'Niemi',
      'Nieto',
      'Nieves',
      'Noll',
      'Nuckols',
      'Oakley',
      'Obrien',
      'Ocampo',
      'Ohara',
      'Olivas',
      'Olsen',
      'O''Neill',
      'Oquinn',
      'Orchard',
      'Orcutt',
      'Orr',
      'Ortega',
      'Ortiz',
      'Osmond',
      'Ouellette',
      'Owen',
      'Owens',
      'Pack',
      'Palmer',
      'Pantoja',
      'Parker',
      'Parmelee',
      'Partain',
      'Pate',
      'Pauly',
      'Payne',
      'Paz',
      'Pearsall',
      'Pearson',
      'Peet',
      'Pehrson',
      'Pemberton',
      'Pence',
      'Pennell',
      'Pereira',
      'Perez',
      'Perrigo',
      'Perry',
      'Perryman',
      'Peterson',
      'Phelps',
      'Phillips',
      'Pickerel',
      'Piper',
      'Pitts',
      'Plant',
      'Plummer',
      'Polster',
      'Pool',
      'Poole',
      'Porter',
      'Power',
      'Prather',
      'Prichard',
      'Pruitt',
      'Puccio',
      'Puma',
      'Putnam',
      'Quinney',
      'Quinones',
      'Rahn',
      'Raines',
      'Ramirez',
      'Ramsey',
      'Randolph',
      'Reed',
      'Reese',
      'Renda',
      'Renshaw',
      'Rettig',
      'Reyes',
      'Reynolds',
      'Richards',
      'Richardson',
      'Riche',
      'Rickert',
      'Roberts',
      'Robertson',
      'Robinson',
      'Robson',
      'Rodriguez',
      'Rogers',
      'Romeo',
      'Rondeau',
      'Ross',
      'Roughton',
      'Rouse',
      'Royster',
      'Rutledge',
      'Ruvalcaba',
      'Ryder',
      'Salazar',
      'Salcido',
      'Salter',
      'Saltsman',
      'Sanchez',
      'Sanders',
      'Sandford',
      'Sandoval',
      'Sansom',
      'Saxton',
      'Scherrer',
      'Schindler',
      'Schlosser',
      'Schmidt',
      'Schuette',
      'Schweitzer',
      'Scott',
      'Seale',
      'Seldon',
      'Shank',
      'Sharp',
      'Sharpe',
      'Shaw',
      'Sheehan',
      'Sheffield',
      'Shelton',
      'Sheridan',
      'Shipman',
      'Shisler',
      'Shrewsbury',
      'Shumpert',
      'Sickels',
      'Sidhu',
      'Sierra',
      'Simms',
      'Simon',
      'Sisemore',
      'Skelton',
      'Slaughter',
      'Small',
      'Smith',
      'Snyder',
      'Solis',
      'Soltis',
      'Sonntag',
      'Spann',
      'Sparks',
      'Spencer',
      'Spinner',
      'Spitler',
      'Stalder',
      'Starr',
      'Steele',
      'Stevenson',
      'Steverson',
      'Stickler',
      'Stocks',
      'Stockwell',
      'Stone',
      'Stonge',
      'Stovall',
      'Strack',
      'Streetman',
      'Strong',
      'Stroup',
      'Strouse',
      'Sullivan',
      'Sumner',
      'Sumrall',
      'Swigart',
      'Tanaka',
      'Tate',
      'Taylor',
      'Tedeschi',
      'Terrones',
      'Thao',
      'Thomas',
      'Thompson',
      'Thrasher',
      'Tibbetts',
      'Todd',
      'Tomlin',
      'Ton',
      'Topper',
      'Tracy',
      'Traylor',
      'Treat',
      'Trevino',
      'Tribble',
      'Truesdale',
      'Truman',
      'Tse',
      'Tucker',
      'Turner',
      'Turnipseed',
      'Tyler',
      'Ulmer',
      'Valverde',
      'Vargas',
      'Varnell',
      'Varner',
      'Vaughn',
      'Vibbert',
      'Vue',
      'Wade',
      'Wafford',
      'Wagner',
      'Walker',
      'Walt',
      'Walton',
      'Ward',
      'Washington',
      'Watkins',
      'Watson',
      'Wayman',
      'Weaver',
      'Webb',
      'Wee',
      'Weist',
      'Wellington',
      'Wells',
      'Wen',
      'West',
      'Westgate',
      'Weyant',
      'Whaley',
      'Wheeler',
      'White',
      'Wick',
      'Wiley',
      'Wilkins',
      'Wilkinson',
      'Williams',
      'Willoughby',
      'Wilson',
      'Wimmer',
      'Winnie',
      'Winston',
      'Winter',
      'Witcher',
      'Witt',
      'Wofford',
      'Wolfe',
      'Wong',
      'Woo',
      'Woodall',
      'Woods',
      'Woodward',
      'Workman',
      'Worley',
      'Wright',
      'Yancey',
      'Young',
      'Zamora',
      'Zavala'
    );
    {$endregion}

    {$region 'Adjectives'}
    Adjectives: array [0 .. 93] of string = (
      'Abused',
      'Ambiguous',
      'Ancient',
      'Arrogant',
      'Automotive',
      'Basic',
      'Blue',
      'Bloated',
      'Bright',
      'Clever',
      'Cold',
      'Cool',
      'Corny',
      'Creepy',
      'Crystal',
      'Deluxe',
      'Dirty',
      'Dizzy',
      'Domestic',
      'Essential',
      'Exact',
      'Exciting',
      'Expensive',
      'Explosive',
      'Express',
      'Faint',
      'Fake',
      'Fancy',
      'Fast',
      'Fat',
      'Frantic',
      'Free',
      'Funny',
      'Future',
      'Good',
      'Great',
      'Giant',
      'Hairy',
      'Happy',
      'Homeless',
      'Hot',
      'Hungry',
      'Incomprehensive',
      'Intimate',
      'Intelligent',
      'Inflamed',
      'Jittery',
      'Kinky',
      'Lonely',
      'Millenium',
      'Monkey',
      'Obsessive',
      'Open',
      'Perfect',
      'Perverse',
      'Pink',
      'Power',
      'Precise',
      'Pulp',
      'Quaint',
      'Random',
      'Rare',
      'Red',
      'Risky',
      'Rusty',
      'Secret',
      'Selfish',
      'Serious',
      'Sick',
      'Simple',
      'Sleepy',
      'Smart',
      'Smelly',
      'Soapy',
      'Social',
      'Solid',
      'Spooky',
      'Star',
      'Stormy',
      'Sure',
      'Tense',
      'Total',
      'Transparant',
      'Ultimate',
      'Unintentional',
      'Vast',
      'Virtual',
      'Vintage',
      'Weird',
      'Wicked',
      'Wild',
      'Wise',
      'Wireless',
      'Zero'
    );
    {$endregion}

    {$region 'CompanySuffixes'}
    CompanySuffixes: array [0 .. 98] of string = (
      'Accessories',
      'Adventures',
      'Addicts',
      'Air',
      'Anomalities',
      'Architecture',
      'Assassinations',
      'Assemblies',
      'Balls',
      'Bills',
      'Business',
      'Cars',
      'Caves',
      'Cartridges',
      'Cleaning',
      'Clothing',
      'Computers',
      'Computing',
      'Concepts',
      'Consultancy',
      'Consulting',
      'Creations',
      'Crimes',
      'Diapers',
      'Disclosures',
      'Diseases',
      'Encounters',
      'Entertainment',
      'Equipment',
      'Experiments',
      'Exploitations',
      'Explorations',
      'Explosives',
      'Emissions',
      'Fiction',
      'Flakes',
      'Flowers',
      'Food',
      'Funerals',
      'Furniture',
      'Fusion',
      'Gestures',
      'Gloves',
      'Greed',
      'Hippies',
      'Hooligans',
      'Heavens',
      'Insects',
      'Instruments',
      'Inventions',
      'Items',
      'Jobs',
      'Jeans',
      'Knowledge',
      'Laboratories',
      'Lightning',
      'Machines',
      'Marriages',
      'Missions',
      'Nuts',
      'Organisms',
      'Ornaments',
      'Oil',
      'Packaging',
      'Plastics',
      'Powertools',
      'Pants',
      'Pets',
      'Pictures',
      'Pipes',
      'Platforms',
      'Power',
      'Projects',
      'Reality',
      'Roots',
      'Rubbers',
      'Questions',
      'Sands',
      'Services',
      'Software',
      'Solutions',
      'Structures',
      'Surgeries',
      'Systems',
      'Technologies',
      'Textiles',
      'Tools',
      'Toys',
      'Towers',
      'Underwear',
      'Vomit',
      'Waste',
      'Wear',
      'Wellness',
      'Winds',
      'Wipers',
      'Wool',
      'Weed',
      'Zombies'
    );
    {$endregion}

    {$region 'CompanyTypes'}
    CompanyTypes: array [0 .. 2] of string = (
      'Corp.',
      'Inc.',
      'Ltd.'
    );
    {$endregion}

    {$region 'StreetPrefixes'}
    StreetPrefixes: array [0 .. 3] of string = (
      'North',
      'East',
      'South',
      'West'
    );
    {$endregion}

    {$region 'StreetBeginnings'}
    StreetBeginnings: array [0 .. 20] of string = (
      'Apple',
      'Banana',
      'Bright',
      'Clear',
      'Corn',
      'Cotton',
      'Debris',
      'Diamond',
      'Green',
      'Gold',
      'Moon',
      'New',
      'Oak',
      'Old',
      'Rock',
      'Salt',
      'Shore',
      'Stone',
      'Sun',
      'Water',
      'White'
    );
    {$endregion}

    {$region 'StreetEndings'}
    StreetEndings: array [0 .. 6] of string = (
      'wood',
      'dale',
      'land',
      'bridge',
      'lake',
      'hill',
      'field'
    );
    {$endregion}

    {$region 'StreetTypes'}
    StreetTypes: array [0 .. 9] of string = (
      'Street',
      'Road',
      'Avenue',
      'Place',
      'Court',
      'Boulevard',
      'Drive',
      'Parkway',
      'Lane',
      'Square'
    );
    {$endregion}

    {$region 'USCities'}
    USCities: array [0 .. 29] of string = (
      'Alabama',
      'Atlanta',
      'Boston',
      'Chicago',
      'Cincinnati',
      'Dallas',
      'Denver',
      'Detroit',
      'Houston',
      'Indianapolis',
      'Kansas City',
      'Las Vegas',
      'Los Angeles',
      'Memphis',
      'Miami',
      'Minneapolis',
      'Nashville',
      'New Orleans',
      'New York',
      'Oklahoma',
      'Omaha',
      'Philadelphia',
      'Pittsburgh',
      'Portland',
      'San Diego',
      'San Fransisco',
      'Seattle',
      'Tampa',
      'Utah',
      'Washington'
    );
    {$endregion}

    {$region 'USStates'}
    USStates: array [0 .. 29] of string = (
      'PR',
      'SC',
      'RJ',
      'RS',
      'SP',
      'MT',
      'CA',
      'PE',
      'PM',
      'PI',
      'TE',
      'TP',
      'TO',
      'ES',
      'BA',
      'MG',
      'MS',
      'AR',
      'AA',
      'AL',
      'DC',
      'FR',
      'QA',
      'QI',
      'SS',
      'HM',
      'LT',
      'YW',
      'YI',
      'TX'
    );
    {$endregion}

    {$region 'DomainSuffixes'}
    DomainSuffixes: array [0 .. 4] of string = (
      'com',
      'org',
      'net',
      'edu',
      'gov'
    );
    {$endregion}

    {$region 'CountryNames'}
    CountryNames: array[0..29] of string = (
      'Argentina',
      'Austria',
      'Australia',
      'Belgium',
      'Brazil',
      'Canada',
      'Switzerland',
      'Germany',
      'Denmark',
      'Estonia',
      'Spain',
      'France',
      'Greece',
      'Hong Kong',
      'Italy',
      'Mexico',
      'Malaysia',
      'Netherlands',
      'Norway',
      'New Zealand',
      'Poland',
      'Portugal',
      'Russia',
      'Sweden',
      'Singapore',
      'Taiwan',
      'Ukraine',
      'United Kingdom',
      'United States',
      'South Africa'
    );
    {$endregion}

  public
    class constructor Create;
    class function Name: string; static;
    class function CompanyName: string; static;
    class function AlliteratedCompanyName: string; static;
    class function Email(const PersonName, DomainName: string): string; static;
    class function FirstName: string; overload; static;
    class function FirstName(Gender: TGender): string; overload; static;
    class function FullName(Gender: TGender): string; static;
    class function LastName: string; static;
    class function PersonName: string; static;
    class function NumberString(Len: Integer): string; static;
    class function Number(ARange: Integer): Integer; overload; static;
    class function Number(AMin: Integer; AMax: Integer): Integer; overload; static;
    class function Street: string; static;
    class function City: string; static;
    class function Country: string; static;
    class function Address: string; static;
    class function State: string; static;
    class function Letter: Char; static;
    class function Consonant: Char; static;
    class function Vowel: Char; static;
    class function Str(const AList: array of string): string; static;
    class function DateTime(AMin: TDateTime; AMax: TDateTime): TDateTime; static;
    class function BirthDate(AMinYear: Word; AMaxYear: Word): TDate; static;
    class function Bool: Boolean; static;

    class function Adjective: string; static;
  end;

implementation

uses
  System.SysUtils, System.Math, System.DateUtils, System.StrUtils,

  DSharp.Collections, DSharp.Collections.Extensions;

class constructor RandomData.Create;
begin
  Randomize;
end;

class function RandomData.Str(const AList: array of string): string;
begin
  Result := AList[Random(Length(AList))];
end;

class function RandomData.Letter: Char;
begin
  Result := Chr(Ord('a') + Random(Ord('z') - Ord('a')));
end;

class function RandomData.Consonant: Char;
begin
  repeat
    Result := Letter;
  until CharInSet(Result, Consonants);
end;

class function RandomData.Country: string;
begin
  Result := Str(CountryNames);
end;

class function RandomData.DateTime(AMin, AMax: TDateTime): TDateTime;
var
 V : Integer;
 D : Double;
begin
  V := Ceil(AMax - AMin);
  D := AMin + RandomRange(0, V);
  Result := TDateTime(D);
end;

class function RandomData.Vowel: Char;
begin
  repeat
    Result := Letter;
  until CharInSet(Result, Vowels);
end;

class function RandomData.Name: string;

  function SmartName: string;
  begin
    Result := Str(SmartPrefixes) + Str(SmartSuffixes);
  end;

  function CombiName: string;
  begin
    Result := Consonant + Vowel;
    if Odd(Random(2)) then
      Result := Result + Consonant;
    Result := Result + Str(SmartSuffixes);
  end;

  function TripletName: string;
  var
    I: Integer;
  begin
    Result := EmptyStr;
    for I := 1 to 3 do
    begin
      Result := Result + Consonant + Vowel;
      if Random(10) = 1 then
        Result := Result + Consonant;
    end;
  end;

begin
  case Random(3) of
    0: Result := SmartName;
    1: Result := CombiName;
    2: Result := TripletName;
  end;
  Result[1] := UpCase(Result[1]);
end;

class function RandomData.CompanyName: string;
begin
  if Random(3) = 0 then
    Result := Name
  else
    Result := Str(Adjectives);

  Result := Result + ' ' + Str(CompanySuffixes) + ' ' + Str(CompanyTypes);
end;

class function RandomData.Email(const PersonName, DomainName: string): string;
var
  Name, FirstName, LastName, Suffix: string;
  I: Integer;
begin
  I := Pos(' ', PersonName);
  if I > 0 then
  begin
    FirstName := Copy(PersonName, 1, Pred(I));
    LastName := PersonName;
    Delete(LastName, 1, I);
  end
  else
  begin
    FirstName := PersonName;
    LastName := EmptyStr;
  end;
  case Random(3) of
    0: Name := FirstName + '.' + LastName;
    1: Name := Copy(FirstName, 1, 1) + Copy(LastName, 1, 1);
    2: Name := Copy(FirstName, 1, 1) + '_' + LastName;
  end;
  if Random(10) <> 0 then // 9 of 10 have .com
    Suffix := DomainSuffixes[0]
  else
    Suffix := Str(DomainSuffixes);
  Result := LowerCase(Name + '@' + DomainName + '.' + Suffix);
end;

class function RandomData.FirstName(Gender: TGender): string;
begin
  Result := FirstNames[Gender, Random(Length(FirstNames[Gender]))];
end;

class function RandomData.FirstName: string;
begin
  Result := RandomData.FirstName(TGender(Random(2)));
end;

class function RandomData.FullName(Gender: TGender): string;
begin
  Result := FirstName(Gender) + ' ' + LastName;
end;

class function RandomData.PersonName: string;
begin
  case Random(2) of
    0: Result := FullName(gnMale);
    1: Result := FullName(gnFemale);
  end;
end;

class function RandomData.LastName: string;
begin
  Result := Str(LastNames);
end;

class function RandomData.Number(ARange: Integer): Integer;
begin
  Result := Random(ARange);
end;

class function RandomData.Number(AMin, AMax: Integer): Integer;
begin
  Result := Random(AMax) + AMin;
end;

class function RandomData.NumberString(Len: Integer): string;
begin
  Result := EmptyStr;
  while Len > 0 do
  begin
    Result := Result + Chr(Ord('0') + Random(10));
    Dec(Len);
  end;
end;

class function RandomData.Street: string;
begin
  if Random(8) = 0 then
    Result := Str(StreetPrefixes) + ' '
  else
    Result := EmptyStr;

  Result := Result + Str(StreetBeginnings) + Str(StreetEndings) + ' ' + Str
    (StreetTypes) + ' ' + IntToStr((Random(499) + 1) div (Random(9) + 1) + 1);
end;

class function RandomData.BirthDate(AMinYear, AMaxYear: Word): TDate;
begin
  Result := DateTime(StartOfAYear(AMinYear), EndOfAYear(AMaxYear));
end;

class function RandomData.Bool: Boolean;
begin
  Result := Random(2) = 1;
end;

class function RandomData.City: string;
begin
  Result := Str(USCities);
end;

class function RandomData.Address: string;
begin
  Result := Format('%s %d %d %s', [Street, Number(2), Number(4), City]);
end;

class function RandomData.Adjective: string;
begin
  Result := Str(Adjectives);
end;

class function RandomData.AlliteratedCompanyName: string;
var
  List  : IList<string>;
  A     : string;
  S     : string;
  C     : string;
  I     : Integer;
  J     : Integer;
  List2 : IList<string>;
begin
  A := Adjective;
  C := A[1];
  List := TList<string>.Create;
  for S in CompanySuffixes do
    List.Add(S);
  List2 := Enumerable<string>(List).Where(
    function(Arg: string): Boolean
    begin
      Result := StartsText(C, Arg);
    end
  ).ToList;
  I := List2.Count;
  if I > 0 then
  begin
    J := Random(I);
    Result := A + ' ' + List2[J] + ' ' + Str(CompanyTypes);
  end
  else
    Result := A + ' ' + Str(CompanyTypes);
    //Lambda.Predicate<string>((Bool(Arg1[1] = Arg(C))))
   //Lambda.Predicate<string>(StartsText(string(Arg1), C))
//  filter1 := Lambda.Predicate<TCustomer>(
//    Bool(Arg1.CompanyName = 'Alfreds Futterkiste')
//      or Bool(Arg1.CompanyName = 'Around the Horn'));
//  filter2 := Lambda.Predicate<TCustomer>(StartsText(Arg(Edit1).Text, Arg1.CompanyName));

end;

class function RandomData.State: string;
begin
  Result := Str(USStates);
end;

end.
